package com.museum.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;
import cn.hutool.jwt.signers.JWTSignerUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/** 使用hutool的jwt工具类
 * @author Akihi
 * @create 2022/11/13
 */

@Data
@Component
@ConfigurationProperties(prefix = "myself.jwt")
@Slf4j
public class JwtUtil {
    private long expire;        //过期时间：秒
    private String secret;        //密钥
    private String header;         //请求头名称

    // 使用HS512算法生成jwt
    public String generateToken(String username) {
        Date nowDate = new Date();
        Date expireDate = new Date(nowDate.getTime() + 1000 * expire);  //现在的时间毫秒数 + 7天的时间毫秒数 = 过期时间
        return JWT.create()
                /*头部信息*/
                .setHeader("typ", "JWT")
                .setSigner(JWTSignerUtil.hs512(secret.getBytes()))//使用HS512算法进行签名
                /*载荷信息*/
                .setSubject(username)
                .setIssuedAt(nowDate)
                .setExpiresAt(expireDate)
                .sign();
    }
    // 验证jwt
    public Boolean verifyJwtByToken(String jwt) {
        // 验证token
        try {
            JWTValidator.of(jwt).validateAlgorithm(JWTSignerUtil.hs512(secret.getBytes()));
            /*tokenIsOk = JWTUtil.verify(jwt, secret.getBytes());*/
        }catch (Exception e) {
            log.error("token异常===> {}",e.getMessage());
            return false;
        }
        return true;
    }

    // jwt是否过期
    public Boolean isTokenExpired(String jwt) {
        try {
            JWTValidator.of(jwt).validateDate(DateUtil.date());
            /*log.info("JWTValidator----> {}", jwtValidator);*/  //cn.hutool.jwt.JWTValidator@3f23e888
        }catch (Exception e){
            log.error("token过期===> {}",e.getMessage());
            return false;
        }
        return true;
    }
}
